package main

import "fmt"

func main()  {
	a := 10
	b := "make"

	//使用自动推导类型定义
	//定义一个匿名函数，没有名字，赋值给一个变量
	f1 := func() {
		fmt.Printf("a = %d\tb = %s\n", a, b)
	}
	//调用匿名函数
	f1()

	//定义一个匿名函数，有参数有返回值
	f4 := func(h int, j string) (hh int, jj string) {
		hh = h
		jj = j
		return
	}

	hhh, jjj := f4(a, b)
	fmt.Printf("hhh = %d, jjj = %s\n", hhh, jjj)


	//不使用自动推导类型的方式
	//定义一个函数数据类型,无参数无返回值
	type funcTest = func()
	var f2 funcTest
	f2 = func(){
		fmt.Printf("a = %d\tb = %s\n", a, b)
	}
	f2()

	//定义一个函数数据类型,有参数有返回值
	type funcTest1 = func(a, b int) (max, min int)
	var f3 funcTest1
	f3 = func(a, b int) (max, min int) {
		if a > b {
			max = a
			min = b
		} else {
			max = b
			min = a
		}

		return
	}

	y, z := f3(12, 21)
	fmt.Printf("y =%d, z = %d\n", y, z)

	//匿名函数定义完后立即使用
	func(){
		fmt.Println("无参数无返回值")
	}()

	yyy := "ttttt"
	func (a int, c string) {
		fmt.Printf("有参数无返回值：a = %d, c = %s\n", a, c)
	}(a, yyy)

	bb, mm := func(a, b int) (aaa, bbb int) {
		aaa = a
		bbb = b
		return
	}(12, 34)
	fmt.Printf("有参数有返回值：bb = %d, mm = %d\n", bb, mm)

}
